1 License

This report is (c) University of Southampton and is published under the CC-BY-4.0 license. You may share, re-use or adapt for commercial or non-commercial purposes with citation.

2 Citation

If you wish to use any of the material in this report please cite it as:

  • Anderson, Ben (2021) Hampshire County GHG Emissions: 2018/19 snapshots and trends over time using various accounting methods and data sources. University of Southampton: Southampton.

3 Introduction

This data report uses two different datasets to estimate the greenhouse gas emissions of the Hampshire County under three different definitions:

  • total annual territorial CO2 emissions for the period 2005 to 2019 using local authority level data from BEIS
  • total annual territorial CO2e emissions (i.e. all emissions, including methane and others) using the territorial emissions method with data from the Centre for Sustainable Energy’s Impact Tool at the local authority level (see methodology report for details of how each category was estimated and the years from which the data is drawn)
  • total annual consumption CO2e emissions (i.e. all emissions) using the consumption emissions method with data from the Centre for Sustainable Energy’s Impact Tool at the local authority level

The analysis is carried out for the ‘Wider Hampshire’ - all local authority districts in the Hampshire County including the unitary authorities of Portsmouth, Southampton and the Isle of Wight. Note that this differs from the baseline estimated for the Hampshire County Council Climate Change Strategy by The Carbon Trust which excluded Portsmouth, Southampton and the Isle of Wight.

4 Data

Load data sources

  • total annual territorial CO2 emissions for 2005 to 2019 (BEIS)
# BEIS LA co2 data
beis_la_co2_DT <- data.table::fread(paste0(params$dataPath,
 "beis/localAuthority/carbon/2005_2019/",                                "2005-19_Local_Authority_CO2_emissions.csv"))

beis_la_co2_DT[, subSectorLabel := `LA CO2 Sub-sector`]
beis_la_co2_DT[, subSectorLabel := ifelse(subSectorLabel == "Agriculture",
     "Industry: Agriculture",
     subSectorLabel)
     ]
beis_la_co2_DT[, subSectorLabel := ifelse(subSectorLabel == "Large Industrial Installations",
     "Industry: Large Industrial Installations",
     subSectorLabel)
]
beis_la_co2_DT[, subSectorLabel := ifelse(subSectorLabel == "Road Transport (A roads)",
     "Transport: (A roads)",
     subSectorLabel)
]
beis_la_co2_DT[, subSectorLabel := ifelse(subSectorLabel == "Road Transport (Minor roads)",
     "Transport: (Minor roads)",
     subSectorLabel)
]
beis_la_co2_DT[, subSectorLabel := ifelse(subSectorLabel == "Road Transport (Motorways)",
     "Transport: (Motorways)",
     subSectorLabel)
]
beis_la_co2_DT[, subSectorLabel := ifelse(subSectorLabel == "Diesel Railways",
     "Transport: Diesel Railways",
     subSectorLabel)
]
beis_la_co2_DT[, la_name := `Local Authority`]


# set up the colours

# colours borrowed from https://git.soton.ac.uk/twr1m15/la_emissions_viz/-/blob/master/shiny/app.R
# for details, use set for each sector
industry_pal <- RColorBrewer::brewer.pal(n = 8, name = "Greys")[4:8]    # industry greys, 5 categories incl Agric
commercial_pal <- RColorBrewer::brewer.pal(n = 8, name = "RdPu")[4:6]    # commercial greys, 3 categories
domestic_pal <- RColorBrewer::brewer.pal(n = 4, name = "Blues")[2:4]    # domestic blues, 3 categories
public_pal <- RColorBrewer::brewer.pal(n = 4, name = "Purples")[2:4]    # public purple, 3 categories
transport_pal <- RColorBrewer::brewer.pal(n = 6, name = "Oranges")[2:6] # transport oranges, 5 categories
lulucf_pal <- RColorBrewer::brewer.pal(n = 9, name = "Greens")[4:9]     # lulucf greens, 6 categories

# for details, combine sets
detailed_pal <- c(commercial_pal, domestic_pal, industry_pal, lulucf_pal, public_pal, transport_pal)

beis_la_co2_DT[, subSectorLabelFact := factor(subSectorLabel)]

catList <- unique(beis_la_co2_DT$subSectorLabelFact) # this is not alphabetical - why?

catList2 <- c(catList[1:15],catList[25] , catList[16:24])

names(detailed_pal) <- catList2

hampshire_beis_la_co2_DT <- getSolent(beis_la_co2_DT)
hampshire_beis_la_co2_DT[, widerHampshire := ifelse(la_name == "Southampton" |
                                                      la_name == "Portsmouth" |
                                                      la_name == "Isle of Wight",
                         "Wider Hampshire",
                         "Hampshire CC")]
## Warning in `[.data.table`(hampshire_beis_la_co2_DT, , `:=`(widerHampshire, :
## Invalid .internal.selfref detected and fixed by taking a (shallow) copy of the
## data.table so that := can add this new column by reference. At an earlier point,
## this data.table has been copied by R (or was created manually using structure()
## or similar). Avoid names<- and attr<- which in R currently (and oddly) may
## copy the whole data.table. Use set* syntax instead to avoid copying: ?set, ?
## setnames and ?setattr. If this message doesn't help, please report your use case
## to the data.table issue tracker so the root cause can be fixed or this message
## improved.
  • total annual territorial CO2e (all GHG) emissions (CSE data)
# CSE impact tool data
cse_territorial_abs_DT <- data.table::fread(paste0(params$dataPath,
 "cse/cse_ImpactTool/",                                "local-authority-all-territorial-absolute.csv.gz"))
cse_territorial_abs_DT[, la_name := name]
hampshire_cse_territorial_abs_DT <- getSolent(cse_territorial_abs_DT)

# make long form for easy summary etc
lDT <- melt(hampshire_cse_territorial_abs_DT)
## Warning in melt.data.table(hampshire_cse_territorial_abs_DT): id.vars and
## measure.vars are internally guessed when both are 'NULL'. All non-numeric/
## integer/logical type columns are considered id.vars, which in this case are
## columns [id, name, la_name, ...]. Consider providing at least one of 'id' or
## 'measure' vars in future.
# remove Power generation - CSE methodology: "Gridded data area apportioned, point data summed within area. Note: this category overlaps with electricity emissions and is provided for information only"
hampshire_cse_territorial_abs_DT <- lDT[variable != "Power generation (t CO2e)"]
hampshire_cse_territorial_abs_DT[, widerHampshire := ifelse(la_name == "Southampton" |
                                                      la_name == "Portsmouth" |
                                                      la_name == "Isle of Wight",
                         "Wider Hampshire",
                         "Hampshire CC")]
  • total annual consumption CO2e emissions (CSE data)
cse_consumption_abs_DT <- data.table::fread(paste0(params$dataPath,
 "cse/cse_ImpactTool/",                                "local-authority-all-consumption-absolute.csv.gz"))
cse_consumption_abs_DT[, la_name := name]
hampshire_cse_consumption_abs_DT <- getSolent(cse_consumption_abs_DT)

# make long form for easy summary etc
hampshire_cse_consumption_abs_DT <- melt(hampshire_cse_consumption_abs_DT)
## Warning in melt.data.table(hampshire_cse_consumption_abs_DT): id.vars and
## measure.vars are internally guessed when both are 'NULL'. All non-numeric/
## integer/logical type columns are considered id.vars, which in this case are
## columns [id, name, la_name, ...]. Consider providing at least one of 'id' or
## 'measure' vars in future.
hampshire_cse_consumption_abs_DT[, widerHampshire := ifelse(la_name == "Southampton" |
                                                      la_name == "Portsmouth" |
                                                      la_name == "Isle of Wight",
                         "Wider Hampshire",
                         "Hampshire CC")]

5 Carbon Trust estimates

As background to the Hampshire County Council Climate Change Strategy, the Carbon Trust was asked to establish baseline emissions for the County excluding Southampton, Portsmouth and Isle of Wight. This baseline was converted to the proportion of emissions from different energy sources and reported as a trend plot on p14 of the Strategy as shown below. This highlighted that the main components of emissions were:

  • Industry & Commercial (~ 39%)
  • Transport (~ 37%)
  • Residential energy use (~ 24%).

Total kT CO2 baseline values were not included in this report.

Hampshire emissions (CarbonTrust, 2020)

# imputed from values given in https://documents.hants.gov.uk/climate-change/ClimateChange-Strategic-Framework-of-Programmes.pdf

hampshire_CT_terr_Totals <- data.table::fread(here::here("data", "ClimateChange-Strategic-Framework-of-Programmes_imputed_Carbon_2019.csv"))
ct_transport <- hampshire_CT_terr_Totals[compareLab == "Transport", .(ktco2_CT)]
ct_res <- hampshire_CT_terr_Totals[compareLab == "Residential", .(ktco2_CT)]
ct_ind <- hampshire_CT_terr_Totals[compareLab == "Industry & Commercial", .(ktco2_CT)]

ct_total <- ct_transport + ct_res + ct_ind

ct_transport_pc <- round(100*(ct_transport/ct_total))
ct_res_pc <- round(100*(ct_res/ct_total))
ct_ind_pc <- round(100*(ct_ind/ct_total))

However the HCC Climate Change Strategic Framework of Programmes which lays out the estimated total kT CO2 and % reduction for a range of proposed actions, enables the following baseline values to be imputed:

  • Industry & Commercial emissions = 3,278 kT CO2
  • Transport emissions = 3,157 kT CO2
  • Residential emissions = 2,011 kT CO2

Giving a total of 8,446 kT CO2 for the 11 districts.

6 BEIS: Territorial CO2 emissions

These were calculated under the territorial emissions method and include only CO2 emissions.

BEIS have produced a useful mapping tool which can be used to compare the spatial distribution of different emissions sources at district level.

6.2 2019 baseline

Table 6.1 shows the total emissions for 2019 for all 14 districts.

t <- hampshire_beis_la_co2_DT[`Calendar Year` == 2019, .(`Total kT CO2e` = sum(`Territorial emissions (kt CO2)`, na.rm = TRUE))]
makeFlexTable(t, cap = "BEIS CO2 emissions (kT, 2019)")
sumBEIS_kt <- sum(hampshire_beis_la_co2_DT[`Calendar Year` == 2019]$`Territorial emissions (kt CO2)`)

Table 6.2 shows the total emissions for 2019 ordered by category. Figure 6.4 shows the data as a bar plot ordered by value. The categories have been colour-coded so that related categories have similar colours in the palette. The largest emissions sources under this method are clearly visible (domestic gas, transport and domestic electricity).

hampshire_beis_terr_Totals <- hampshire_beis_la_co2_DT[`Calendar Year` == 2019, .(`Total kT CO2` = sum(`Territorial emissions (kt CO2)`, na.rm = TRUE)), keyby = .(subSectorLabelFact)]

absTotal <- sum(hampshire_beis_la_co2_DT[`Calendar Year` == 2019, abs(`Territorial emissions (kt CO2)`)])
                
hampshire_beis_terr_Totals[, `% of gross` := 100*(`Total kT CO2`/absTotal)]

makeFlexTable(hampshire_beis_terr_Totals[, .(Source = subSectorLabelFact, 
                                             `Total kT CO2`, `% of gross`)], cap = "BEIS CO2 emissions sorted by category (Hampshire, 2019)")
ggplot2::ggplot(hampshire_beis_terr_Totals, aes(x = reorder(subSectorLabelFact, -`Total kT CO2`), 
                       y = `Total kT CO2`,
                       fill = subSectorLabelFact)) +
  geom_col() +
  scale_fill_manual(values = detailed_pal) +
  theme(legend.position = "none") +
  labs(x = "LA CO2 Sub-sector") +
  coord_flip()
BEIS CO2 emissions by category (Hampshire, 2019 ordered by emissions value)

Figure 6.4: BEIS CO2 emissions by category (Hampshire, 2019 ordered by emissions value)

# p <- ggplot2::ggplot(subsetDT, aes(x = `Calendar Year`, y = `Territorial emissions (kt CO2)`,
#                             fill = subSectorLabel,
#                             colour = subSectorLabel)) +
#   geom_col(position = "stack") +
#   scale_colour_manual(values = detailed_pal) +
#   scale_fill_manual(values = detailed_pal) #
# p

Figure 6.5 shows a cumulative emissions plot for the BEIS 2019 data ordered by the emissions source’s magnitude. The largest increments are therefore due to domestic gas use and various forms of transport. The plot uses vertical lines to show the sources which comprise 50%, 75% and 90% of the total emissions. The plot curls due to the source categories with negative emissions such that the final point represents the total ‘net’ emissions.

t <- hampshire_beis_terr_Totals[order(-`Total kT CO2`)]
t[, cumulative := cumsum(`Total kT CO2`)]

pc_50 <- 0.5*(sum(t$`Total kT CO2`))
pc_75 <- 0.75*(sum(t$`Total kT CO2`))
pc_90 <- 0.90*(sum(t$`Total kT CO2`))

p <- ggplot2::ggplot(t, aes(x = reorder(subSectorLabelFact, -`Total kT CO2`), 
                       y = cumulative,
                       colour = subSectorLabelFact)) +
  geom_point() +
  ylim(0,NA) +
  scale_colour_manual(values = detailed_pal) +
  theme(legend.position = "none") +
  labs(x = "LA CO2 Sub-sector",
       y = "Cumulative kT CO2/annum",
       cap = "Vertical lines % of net emissions") +
  coord_flip()

# add reference lines
p + 
  geom_hline(aes(yintercept = pc_50), colour = "grey") +
  geom_hline(aes(yintercept = pc_75), colour = "grey") +
  geom_hline(aes(yintercept = pc_90), colour = "grey") +
  annotate("text", x = "Transport Other", y = pc_50, label = "50%", colour = "grey") +
  annotate("text", x = "Transport Other", y = pc_75, label = "75%", colour = "grey") +
  annotate("text", x = "Transport Other", y = pc_90, label = "90%", colour = "grey")
Plot of cumulative emissions (BEIS, 2019)

Figure 6.5: Plot of cumulative emissions (BEIS, 2019)

h_beis2019 <- hampshire_beis_la_co2_DT[`Calendar Year` == 2019]
beis_trans <- sum(h_beis2019[`LA CO2 Sub-sector` %like% "Motorway" | `LA CO2 Sub-sector` %like% "roads", `Territorial emissions (kt CO2)`])

beis_motorways <- sum(h_beis2019[`LA CO2 Sub-sector` %like% "Motorway", `Territorial emissions (kt CO2)`])

beis_d_gas <- sum(h_beis2019[`LA CO2 Sub-sector` %like% "Domestic Gas", `Territorial emissions (kt CO2)`])
beis_d_elec <- sum(h_beis2019[`LA CO2 Sub-sector` %like% "Domestic Electricity", `Territorial emissions (kt CO2)`])

beis_forest <- sum(h_beis2019[`LA CO2 Sub-sector` %like% "Forest", `Territorial emissions (kt CO2)`])

beis_grassland <- sum(h_beis2019[`LA CO2 Sub-sector` %like% "Grass", `Territorial emissions (kt CO2)`])

beis_wetlands <- sum(h_beis2019[`LA CO2 Sub-sector` %like% "Wetland", `Territorial emissions (kt CO2)`])

beis_crop <- sum(h_beis2019[`LA CO2 Sub-sector` %like% "Crop", `Territorial emissions (kt CO2)`])

h_beis2019[, zeroC := ifelse(`LA CO2 Sub-sector` %like% "Gas",
                             0,
                             `Territorial emissions (kt CO2)`)]

h_beis2019[, zeroC := ifelse(`LA CO2 Sub-sector` %like% "Electricity",
                             0,
                             `Territorial emissions (kt CO2)`)]

h_beis2019[, zeroC := ifelse(`LA CO2 Sub-sector` %like% "roads",
                             0,
                             `Territorial emissions (kt CO2)`)]

beis_allSum <- sum(h_beis2019$`Territorial emissions (kt CO2)`)
zeroCsum <- sum(h_beis2019$zeroC)

Thus, if we focus on BEIS territorial CO2 only then the main sources of emissions are:

  • Transport (Motorways, A roads and minor roads combined): 3,838 kT (46 %);
  • Domestic gas: 1,716 kT (2019);
  • Domestic electricity: 689 kT (2019)

Taken together these domestic (residential) emissions comprise 29 % of the estimated total.

Negative emissions (sequestration) sources are:

  • Forest: -484 kT (2019)
  • Grassland: -195 kT (2019) - note that this does not allow for methane emissions from grazing livestock
  • Wetlands: -0.262 kT (2019) - this is perhaps surprisingly small given the coastal nature of the County and the existence of a number of wetland habitats

As Figure 6.4 showed, these levels of sequestration currently provide a negligible offset to the overall emissions. Note also that cropland is a net emitter at 138 kT (2019).

Figure 6.2 showed that the only emissions sources showing substantial decreases over time have been electricity due to grid decarbonisation and (potentially) reductions in some industrial activity as well as the use of ‘Other fuels’ by industry. Although emissions from domestic gas use have also fallen over time they appear to have stabilised since 2014. Perhaps of most concern given their dominant contribution however is the relative stability of road transport emissions over the 2005 - 2019 period.

7 CSE: Territorial-based all GHG emissions

These are calculated under the territorial emissions method and include all greenhouse gas emissions.

7.1 2019 baseline

Table 7.1 shows the total emissions for 2019.

t <- hampshire_cse_territorial_abs_DT[, .(`Total kT CO2e` = sum(value, na.rm = TRUE)/1000)]
makeFlexTable(t, cap = "CSE territorial emissions (Hampshire, 2019)")
sumCSETerr_kt <- sum(hampshire_cse_territorial_abs_DT$value)/1000

Table 7.2 shows the total emissions for 2019 by category. Figure 7.1 shows the data as a bar plot. The largest emissions sources under this method are clearly visible (domestic gas, transport and aviation). Note that some of the categories do not exactly match those used in the BEIS data.

Ignore the (t CO2e) in the label - the plot shows kT for easy comparison (labels to be fixed).

hampshire_cse_terr_Totals <- hampshire_cse_territorial_abs_DT[, .(`Total kT CO2e` = sum(value, na.rm = TRUE)/1000), keyby = .(variable)]

absTotal <- sum(hampshire_cse_territorial_abs_DT[, abs(value)])/1000
                
hampshire_cse_terr_Totals[, `% of gross` := 100*(`Total kT CO2e`/absTotal)]

makeFlexTable(hampshire_cse_terr_Totals, cap = "CSE all territorial emissions by category (Hampshire, 2019)")
ggplot2::ggplot(hampshire_cse_terr_Totals, aes(x = reorder(variable, -`Total kT CO2e`), 
                       y = `Total kT CO2e`,
                       fill = variable)) +
  geom_col() +
  #scale_fill_manual(values = detailed_pal) +
  theme(legend.position = "none") +
  labs(x = "Emissions source") +
  coord_flip()
CSE all territorial emissions by category (Hampshire, 2019 ordered by emissions value)

Figure 7.1: CSE all territorial emissions by category (Hampshire, 2019 ordered by emissions value)

# p <- ggplot2::ggplot(subsetDT, aes(x = `Calendar Year`, y = `Territorial emissions (kt CO2)`,
#                             fill = subSectorLabel,
#                             colour = subSectorLabel)) +
#   geom_col(position = "stack") +
#   scale_colour_manual(values = detailed_pal) +
#   scale_fill_manual(values = detailed_pal) #
# p

Figure 7.2 shows a cumulative emissions plot for the CSE territorial data ordered by the emissions source’s magnitude. The largest increments are therefore due to personal transport, domestic gas use and aviation. The plot shows the sources which comprise 50%, 75% and 90% of the total emissions. The plot curls due to the source categories with negative emissions such that the final point represents the total ‘net’ emissions.

t <- hampshire_cse_terr_Totals[order(-`Total kT CO2e`)]
t[, cumulative := cumsum(`Total kT CO2e`)]

pc_50 <- 0.5*(sum(t$`Total kT CO2e`))
pc_75 <- 0.75*(sum(t$`Total kT CO2e`))
pc_90 <- 0.90*(sum(t$`Total kT CO2e`))

p <- ggplot2::ggplot(t, aes(x = reorder(variable, -`Total kT CO2e`), 
                       y = cumulative,
                       colour = variable)) +
  geom_point() +
  ylim(0,NA) +
  theme(legend.position = "none") +
  labs(x = "Emissions source",
       y = "Cumulative kT CO2e/annum",
       cap = "Vertical lines % of net emissions") +
  coord_flip()

# add reference lines
p + 
  geom_hline(aes(yintercept = pc_50), colour = "grey") +
  geom_hline(aes(yintercept = pc_75), colour = "grey") +
  geom_hline(aes(yintercept = pc_90), colour = "grey") +
  annotate("text", x = "Other Transport (t CO2e)", y = pc_50, label = "50%", colour = "grey") +
  annotate("text", x = "Other Transport (t CO2e)", y = pc_75, label = "75%", colour = "grey") +
  annotate("text", x = "Other Transport (t CO2e)", y = pc_90, label = "90%", colour = "grey")
Plot of cumulative emissions (BEIS, 2019)

Figure 7.2: Plot of cumulative emissions (BEIS, 2019)

cse_terr_Transport <- hampshire_cse_terr_Totals[variable %like% "Road Trans"]$`Total kT CO2e`

beis_terr_Transport <- sum(hampshire_beis_terr_Totals[subSectorLabelFact %like% "road" |
                                                        subSectorLabelFact %like% "Motorway"]$`Total kT CO2`)

cse_terr_DomGas <- hampshire_cse_terr_Totals[variable %like% "Housing - Mains gas"]$`Total kT CO2e`
beis_terr_DomGas <- hampshire_beis_terr_Totals[subSectorLabelFact %like% "Domestic Gas"]$`Total kT CO2`

cse_terr_aviation <- hampshire_cse_terr_Totals[variable %like% "Aviation"]$`Total kT CO2e`
cse_terr_shipping <- hampshire_cse_terr_Totals[variable %like% "Shipping"]$`Total kT CO2e`
cse_terr_fgas <- hampshire_cse_terr_Totals[variable %like% "F-gases"]$`Total kT CO2e`
cse_terr_waste <- hampshire_cse_terr_Totals[variable %like% "Waste"]$`Total kT CO2e`
cse_terr_AgricLivestock <- hampshire_cse_terr_Totals[variable %like% "Agriculture - Livestock"]$`Total kT CO2e`

cse_terr_diff <- cse_terr_aviation + cse_terr_shipping + cse_terr_fgas + cse_terr_waste

pc_diff <- 100*(cse_terr_diff/(sumCSETerr_kt - sumBEIS_kt))

pc_tot_diff <- 100*((sumCSETerr_kt-sumBEIS_kt)/sumBEIS_kt)

Thus, if we focus on CSE territorial emissions, which include all emissions, the main sources are:

  • Road transport (4,055 T CO2e (33 % of total);
  • Housing (domestic) gas (1,657 T CO2e;
  • Aviation (1,203 T CO2e - flights and freight)

These figures draw attention to the significant emissions due to aviation which are not included in the BEIS LA level data. Indeed, 73 % of the 45 % increase from the BEIS figure comprises emissions from:

  • Aviation (1,203 kT CO2e - i.e. flights & freight),
  • Waste management (704 kT CO2e - methane from landfill and CO2 from incineration),
  • Shipping (479 kT CO2e) and
  • F-Gases (374 kT CO2e)

Note that under the CSE approach, Agriculture - Livestock and crop-related emissions amount to 457 T CO2e compared to the BEIS value for Cropland at 138 T CO2e which gives some indication of the additional emissions due to methane (noting that fuel used for agriculture is already in a separate category under the CSE approach - see methodology, p15).

8 CSE: Consumption-based all GHG emissions

These are calculated under the consumption emissions method and include all greenhouse gas emissions.

8.1 2019 baseline

Table 8.1 shows the total emissions for 2019.

t <- hampshire_cse_consumption_abs_DT[, .(`Total kT CO2e` = sum(value, na.rm = TRUE)/1000)]
makeFlexTable(t, cap = "CSE consumption emissions (Hampshire, 2019)")
sumCSECons_kt <- sum(hampshire_cse_consumption_abs_DT$value)/1000

Table 8.2 shows the total emissions for 2019 by category. Figure 8.1 shows the data as a bar plot. The largest emissions sources under this method are clearly visible (purchased goods, services and food/diet and gas-use). Note that some of the categories do not exactly match those used in the BEIS data. Ignore the (t CO2e) in the label - the plot shows kT for easy comparison.

Ignore the (t CO2e) in the label - the plot shows kT for easy comparison (labels to be fixed).

hampshire_cse_cons_Totals <- hampshire_cse_consumption_abs_DT[, .(`Total kT CO2e` = sum(value, na.rm = TRUE)/1000), keyby = .(variable)]



absTotal <- sum(hampshire_cse_consumption_abs_DT[, abs(value)])/1000
                
hampshire_cse_cons_Totals[, `% of gross` := 100*(`Total kT CO2e`/absTotal)]

makeFlexTable(hampshire_cse_cons_Totals[, .(Source = variable,
                                            `Total kT CO2e`, `% of gross`)], cap = "CSE all consumption emissions ordered by category (Hampshire, 2019)")
library(stringr)
hampshire_cse_cons_Totals[, variable_n := stringr::str_remove(variable, "Consumption of goods and services - ")]

ggplot2::ggplot(hampshire_cse_cons_Totals, aes(x = reorder(variable_n, -`Total kT CO2e`), 
                       y = `Total kT CO2e`,
                       fill = variable_n)) +
  geom_col() +
  #scale_fill_manual(values = detailed_pal) +
  theme(legend.position = "none") +
  labs(x = "Emissions source") +
  coord_flip()
CSE all territorial emissions ordered by category value (Hampshire, 2019 ordered by emissions value)

Figure 8.1: CSE all territorial emissions ordered by category value (Hampshire, 2019 ordered by emissions value)

Figure 8.2 shows a cumulative emissions plot for the CSE territorial data ordered by the emissions source’s magnitude. The largest increments are therefore due to consumpiton of goods and services, food and diet (meat & fish) and mains gas use. The plot shows the sources which comprise 50%, 75% and 90% of the total emissions.

t <- hampshire_cse_cons_Totals[order(-`Total kT CO2e`)]
t[, cumulative := cumsum(`Total kT CO2e`)]

pc_50 <- 0.5*(sum(t$`Total kT CO2e`))
pc_75 <- 0.75*(sum(t$`Total kT CO2e`))
pc_90 <- 0.90*(sum(t$`Total kT CO2e`))

p <- ggplot2::ggplot(t, aes(x = reorder(variable_n, -`Total kT CO2e`), 
                       y = cumulative,
                       colour = variable_n)) +
  geom_point() +
  ylim(0,NA) +
  theme(legend.position = "none") +
  labs(x = "Emissions source",
       y = "Cumulative kT CO2e/annum",
       cap = "Vertical lines % of net emissions") +
  coord_flip()

# add reference lines
p + 
  geom_hline(aes(yintercept = pc_50), colour = "grey") +
  geom_hline(aes(yintercept = pc_75), colour = "grey") +
  geom_hline(aes(yintercept = pc_90), colour = "grey") +
  annotate("text", x = "Housing - Oil (t CO2e)", y = pc_50, label = "50%", colour = "grey") +
  annotate("text", x = "Housing - Oil (t CO2e)", y = pc_75, label = "75%", colour = "grey") +
  annotate("text", x = "Housing - Oil (t CO2e)", y = pc_90, label = "90%", colour = "grey")
Plot of cumulative emissions (BEIS, 2019)

Figure 8.2: Plot of cumulative emissions (BEIS, 2019)

cse_cons_purch <- hampshire_cse_cons_Totals[variable %like% "Purchase of goods"]$`Total kT CO2`
cse_cons_food_meat <- hampshire_cse_cons_Totals[variable %like% "Meat and fish"]$`Total kT CO2`
cse_cons_DomGas <- hampshire_cse_cons_Totals[variable %like% "Housing - Mains gas"]$`Total kT CO2`
cse_cons_food_other <- hampshire_cse_cons_Totals[variable %like% "Other food and drink"]$`Total kT CO2`
cse_cons_private_trans <- hampshire_cse_cons_Totals[variable %like% "Private transport"]$`Total kT CO2`

cse_cons_flights <- hampshire_cse_cons_Totals[variable %like% "Flights"]$`Total kT CO2`

cons_sum <- cse_cons_purch + cse_cons_food_meat + cse_cons_DomGas + cse_cons_food_other + cse_cons_private_trans

con_sum_pc <- 100*(cons_sum/sumCSECons_kt)

Thus, if we focus on CSE consumption-based emissions which include emissions ‘outsourced’ to other geographical areas (including overseas), the main emissions sources comprising 65 % of emissions are:

  • Purchased goods (2,623 kT CO2e)
  • Food and diet - meat & fish (1,722 kT CO2e)
  • Domestic gas ( 1,657 kT CO2e as before)
  • Food and diet - other (1,414 kT CO2e)
  • Private transport (1,378 kT CO2e)

Emissions due to Flights (970 kT CO2e) are lower than the territorial based Aviation emissions values since emissions due to freight are included under ‘Good and services.’

This approach to emissions accounting shows the extent to which the consumption of goods and services, diet and food as well as transport and domestic gas use dominate Hampshire’s ‘consumption’ emissions footprint.

9 Summary

sumBEIS_hcc_kt <- sum(hampshire_beis_la_co2_DT[widerHampshire != "Wider Hampshire" & `Calendar Year` == 2019, `Territorial emissions (kt CO2)`])

Overall, the total GHG emissions for Hampshire under different methodologies were found to be:

  • Carbon Trust analysis (11 districts excluding Portsmouth, Southampton and the Isle of Wight): 8,446 kT CO2
  • BEIS territorial CO2 only: 6,484 kT CO2 (11 districts excluding Portsmouth, Southampton and the Isle of Wight), 8,421 kT CO2 (14 districts including Portsmouth, Southampton and the Isle of Wight)
  • CSE territorial emissions (all GHG, all 14 districts): 12,216 kT CO2e - 45 % higher than the BEIS total
  • CSE consumption emissions (all GHG, all 14 districts): 13,633 kT CO2e

Given that the Carbon Trust area excludes Portsmouth, Southampton and the Isle of Wight it is unclear why this total is similar to the ‘14 local authorities’ BEIS data.

Which of these accounting methods we choose to focus on depends what we want to show and what we want to achieve. The same is true of the emissions subcategories. The BEIS data gives a partial view on territorial emissions as it excludes all non-CO2 emissions (such as methane from livestock) and also excludes aviation (flights & freight) and shipping. The CSE territorial emissions data includes these ‘missing’ emissions and so gives a much larger total as they are major contributors.

Table 9.1 compares the Carbon Trust, BEIS and CSE data to the extent that it is possible to do so from the data reported here.

hampshire_beis_terr_Totals[, compareLab := ifelse(subSectorLabelFact %like% "Transport", "Transport", "Other")]
hampshire_beis_terr_Totals[, compareLab := ifelse(subSectorLabelFact %like% "Domestic", "Residential", compareLab)]
hampshire_beis_terr_Totals[, compareLab := ifelse(subSectorLabelFact %like% "Commercial" | subSectorLabelFact %like% "Industry", "Industry & Commercial", compareLab)]
# NB - Public is coded to Other
hampshire_beis_Compare <- hampshire_beis_terr_Totals[, .(ktco2_beis = sum(`Total kT CO2`)), keyby = .(compareLab)]
hampshire_beis_Compare[, ktco2_beis_pc := 100*(ktco2_beis / sum(hampshire_beis_Compare$ktco2_beis))]

hampshire_cse_terr_Totals[, compareLab := ifelse(variable %like% "Transport", "Transport", "Other")]
hampshire_cse_terr_Totals[, compareLab := ifelse(variable %like% "Housing", "Residential", compareLab)]
hampshire_cse_terr_Totals[, compareLab := ifelse(variable %like% "Industrial" | variable %like% "Power", "Industry & Commercial", compareLab)]
hampshire_cse_terr_Totals[, compareLab := ifelse(variable %like% "Aviation", "Aviation", compareLab)]
hampshire_cse_terr_Compare <- hampshire_cse_terr_Totals[, .(ktco2_cse_terr = sum(`Total kT CO2e`)), keyby = .(compareLab)]
hampshire_cse_terr_Compare[, ktco2_cse_terr_pc := 100*(ktco2_cse_terr / sum(hampshire_cse_terr_Compare$ktco2_cse_terr))]

hampshire_cse_cons_Totals[, compareLab := ifelse(variable %like% "Travel", "Transport", "Other")]
hampshire_cse_cons_Totals[, compareLab := ifelse(variable %like% "Housing", "Residential", compareLab)]
hampshire_cse_cons_Totals[, compareLab := ifelse(variable %like% "Consumption", "Consumption of goods & services", compareLab)]
hampshire_cse_cons_Totals[, compareLab := ifelse(variable %like% "Food", "Food & diet", compareLab)]
hampshire_cse_cons_Totals[, compareLab := ifelse(variable %like% "Travel - Flights", "Aviation", compareLab)]

hampshire_cse_cons_Compare <- hampshire_cse_cons_Totals[, .(ktco2_cse_cons = sum(`Total kT CO2e`)), keyby = .(compareLab)]
hampshire_cse_cons_Compare[, ktco2_cse_cons_pc := 100*(ktco2_cse_cons / sum(hampshire_cse_cons_Compare$ktco2_cse))]


setkey(hampshire_beis_Compare, compareLab)
setkey(hampshire_cse_terr_Compare, compareLab)
setkey(hampshire_cse_cons_Compare, compareLab)
setkey(hampshire_CT_terr_Totals, compareLab)

dt <- hampshire_CT_terr_Totals[hampshire_beis_Compare][hampshire_cse_terr_Compare]

t <- merge(dt, hampshire_cse_cons_Compare, all = TRUE)

makeFlexTable(t[,.(Source = compareLab,
                   CarbonTrust = ktco2_CT,
                   `Carbon Trust %` = ktco2_CT_pc,
                   BEIS = ktco2_beis,
                   `BEIS %` = ktco2_beis_pc,
                   `CSE Territorial` = ktco2_cse_terr,
                   `CSE Territorial %` = ktco2_cse_terr_pc,
                   `CSE Consumption` = ktco2_cse_cons,
                   `CSE Consumption %` = ktco2_cse_cons_pc)][order(CarbonTrust)], cap = "Comparing emissions baselines (values = kT CO2e or %)")

The table shows that the two main policy foci of the Hampshire County Council Climate Change Strategy - Transport and Residential - contribute at least 30% of emissions irrespective of the emissions accounting method used.

For reasons that are unclear, the Carbon Trust estimate for Industrial & Commercial emissions for the ‘11 districts’ appears to be considerably larger than the comparable BEIS ‘14 districts’ value. As a result the BEIS proportions for Transport and Residential emissions are higher (77% combined) compared to 58% in the Carbon Trust estimates for 11 districts.

Although the ‘14 districts’ BEIS and CSE (territorial) main categories are broadly similar in terms of kT CO2(e), the percentage contribution of Transport and Residential emissions are considerably lower (56%) for the CSE data. This is due to the inclusion of additional sources such as Aviation (10%, shown), as well as complete waste emissions, shipping, livestock emissions, F-gases and others (coded as ‘Other,’ 14%, but see Table 7.2 for details). These represent over 20% of county-wide emissions under the CSE territorial methodology.

Finally, the CSE consumption emissions data demonstrates the significant contribution that consumption of services as well as food and diet make to our ‘extended’ emissions footprint if we consider the emissions we have effectively outsourced to other geographical areas. This method transfers all of the industrial/commercial emissions and a significant proportion of the Transport/Aviation emissions to ‘Good and services’ and ‘Food and diet’ (i.e. supply chain transportation and distribution). As a result emissions from homes and private transport comprise only 30% of the total under this approach with ‘consumption’ representing 58% and flights a further 7%.

Future work could:

  • assess the extent to which currently proposed Programmes address the major emissions sources under each emissions accounting method and review the capability of County and District Authorities in influencing these sources (c.f. the Committee on Climate Change’s recommendations as part of the 6th Carbon Budget and the more recent National Audit Office 2021 report on local government and net zero in England);
  • analyse the district level emissions to understand their distributions according to the different methodologies and hence inform district level prioritisation where this is not already in hand;
  • work with BEIS to ensure the inclusion of all territorial GHG emissions in the annual BEIS district level dataset.

10 R environment

Analysis completed in 7.19 seconds ( 0.12 minutes) using knitr in RStudio with R version 4.1.1 (2021-08-10) running on x86_64-apple-darwin17.0.

10.1 R packages used

  • base R (R Core Team 2016)
  • bookdown (Xie 2016a)
  • data.table (Dowle et al. 2015)
  • flextable (Gohel 2021)
  • knitr (Xie 2016b)
  • rmarkdown (Allaire et al. 2018)

References

Allaire, JJ, Yihui Xie, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, Hadley Wickham, Joe Cheng, and Winston Chang. 2018. Rmarkdown: Dynamic Documents for r. https://CRAN.R-project.org/package=rmarkdown.
Dowle, M, A Srinivasan, T Short, S Lianoglou with contributions from R Saporta, and E Antonyan. 2015. Data.table: Extension of Data.frame. https://CRAN.R-project.org/package=data.table.
Gohel, David. 2021. Flextable: Functions for Tabular Reporting. https://CRAN.R-project.org/package=flextable.
R Core Team. 2016. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Xie, Yihui. 2016a. Bookdown: Authoring Books and Technical Documents with R Markdown. Boca Raton, Florida: Chapman; Hall/CRC. https://github.com/rstudio/bookdown.
———. 2016b. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://CRAN.R-project.org/package=knitr.